
/* 可以使用es6的Object.assign 合并多个对象
此时 people 会被推断成一个交差类型 Name & Age & sex; */
interface Name {
  name: string
}
interface Age {
  age: number
}
interface Sex {
  sex: number
}

let people1: Name = { name: "小满" }
let people2: Age = { age: 20 }
let people3: Sex = { sex: 1 }

const people = Object.assign(people1,people2,people3)

// ps2 类
// 声明两个mixins类 （严格模式要关闭不然编译不过）
// 结合了这两个mixins
// 首先应该注意到的是，没使用extends而是使用implements。 把类当成了接口
class AQ {
  type: boolean = false;
  changeType() {
      this.type = !this.type
  }
}

class BQ {
  name: string = '张三';
  getName(): string {
      return this.name;
  }
}
class CCQ implements AQ,BQ{
  type:boolean
  changeType:()=>void;
  name: string;
  getName:()=> string
}
let ccq  = new CCQ();
ccq.type = false;
console.log(ccq);

// Object.getOwnPropertyNames()可以获取对象自身的属性，除去他继承来的属性，
// 对它所有的属性遍历，它是一个数组，遍历一下它所有的属性名

/* /Object.getOwnPropertyNames() 是一个 JavaScript 的方法，
它返回一个由给定对象的所有自身属性。这意味着它会返回对象的所有属性，
无论是通过对象字面量定义的，还是通过Object.defineProperty()或
Object.defineProperties()定义的。 */

Mixins(CCQ, [BQ, AQ])
function Mixins(curCls: any, itemCls: any[]) {
    itemCls.forEach(item => {
        Object.getOwnPropertyNames(item.prototype).forEach(name => {
            curCls.prototype[name] = item.prototype[name]
        })
    })
}